﻿/**
 * @file NisLaneCommon_Struct.h
 * @brief NisLaneCommon
 * @details 
 * @mainpage http://www.navinfo.com/
 * @author Navinfo
 * @email 400-810-0880
 * @license Navinfo Co.,Ltd. All rights reserved
 */
#ifndef	__NISLANECOMMONSTRUCT_H_
#define	__NISLANECOMMONSTRUCT_H_

PRAGMA_PACK_PUSH

namespace Navinfo {
namespace Nis {

class CLaneMarking;
class CLaneMarkingInfoFlag;
class CLaneMarkingInfo;
class CLaneConnectivityFlag;
class CLaneCenterline;
class CLaneBoundaryParallelElementGroup;
class CLaneBoundaryParallelElement;
class CLaneBoundaryElementFlag;
class CLaneBoundaryElement;
class CTransitionLaneTypeFlag;
class CTransitionLaneType;
class CWidthFlag;
class CWidth;
class CLaneMarkingSet;
class CWidthSet;
class CTransitionLaneTypeSet;
class CLaneType;

/**
 * @brief TRANSITION_LANE_TYPE
 * 
 */
enum TRANSITION_LANE_TYPE {
	TRANSITION_LANE_TYPE_SPLIT = 0,	///<	车道分流
	TRANSITION_LANE_TYPE_MERGE = 1,	///<	车道合流
};
/**
 * @brief LANE_BOUNDARY_TYPE
 * 
 */
enum LANE_BOUNDARY_TYPE {
	LANE_BOUNDARY_TYPE_NO_MARKING = 0,	///<	无边线
	LANE_BOUNDARY_TYPE_LONG_DASHED_LINE = 1,	///<	虚线
	LANE_BOUNDARY_TYPE_SINGLE_SOLID_LINE = 3,	///<	实线
	LANE_BOUNDARY_TYPE_SHORT_DASHED_LINE = 6,	///<	特殊虚线
	LANE_BOUNDARY_TYPE_CURB = 11,	///<	路牙
	LANE_BOUNDARY_TYPE_WALL_FLAT = 12,	///<	墙
	LANE_BOUNDARY_TYPE_END_OF_ROAD = 20,	///<	铺设路面边缘
	LANE_BOUNDARY_TYPE_GORE = 23,	///<	三角岛
	LANE_BOUNDARY_TYPE_OFFSET_SPACE = 25,	///<	两条边线之间的偏移
	LANE_BOUNDARY_TYPE_OTHER_BARRIER = 30,	///<	其他护栏
};
/**
 * @brief LANE_BOUNDARY_MATERIAL
 * 
 */
enum LANE_BOUNDARY_MATERIAL {
	LANE_BOUNDARY_MATERIAL_VIBRATION_MARKINGS = 7,	///<	突起铺设路面标线
	LANE_BOUNDARY_MATERIAL_PAINTED_VIBRATION_DIVIDER = 8,	///<	油漆和突起铺设路面标线
	LANE_BOUNDARY_MATERIAL_PAINTED = 9,	///<	油漆
};


/**
 * @brief 可行驶方向
 * 
 */
class DLL_PUBLIC CLaneMarking
{
public:
	CLaneMarking();

	explicit CLaneMarking(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得IsLeftOne
	 * @details 
	 *
	 * @return 左后
	 */
	Navinfo::Nis::BOOL GetIsLeftOne() const;

	/**
	 * @brief 取得IsLeftTwo
	 * @details 
	 *
	 * @return 左转
	 */
	Navinfo::Nis::BOOL GetIsLeftTwo() const;

	/**
	 * @brief 取得IsLeftThree
	 * @details 
	 *
	 * @return 左前
	 */
	Navinfo::Nis::BOOL GetIsLeftThree() const;

	/**
	 * @brief 取得IsAhead
	 * @details 
	 *
	 * @return 直行
	 */
	Navinfo::Nis::BOOL GetIsAhead() const;

	/**
	 * @brief 取得IsRightThree
	 * @details 
	 *
	 * @return 右前
	 */
	Navinfo::Nis::BOOL GetIsRightThree() const;

	/**
	 * @brief 取得IsRightTwo
	 * @details 
	 *
	 * @return 右转
	 */
	Navinfo::Nis::BOOL GetIsRightTwo() const;

	/**
	 * @brief 取得IsRightOne
	 * @details 
	 *
	 * @return 右后
	 */
	Navinfo::Nis::BOOL GetIsRightOne() const;

	/**
	 * @brief 取得IsUTurn
	 * @details 
	 *
	 * @return 掉头
	 */
	Navinfo::Nis::BOOL GetIsUTurn() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucIsLeftOne				: 1;			///<	  左后  
			uchar												m_ucIsLeftTwo				: 1;			///<	  左转  
			uchar												m_ucIsLeftThree				: 1;			///<	  左前  
			uchar												m_ucIsAhead					: 1;			///<	  直行  
			uchar												m_ucIsRightThree			: 1;			///<	  右前  
			uchar												m_ucIsRightTwo				: 1;			///<	  右转  
			uchar												m_ucIsRightOne				: 1;			///<	  右后  
			uchar												m_ucIsUTurn					: 1;			///<	  掉头  
		};
	};
};


/**
 * @brief LaneMarkingInfoFlag
 * 
 */
class DLL_PUBLIC CLaneMarkingInfoFlag
{
public:
	CLaneMarkingInfoFlag();

	explicit CLaneMarkingInfoFlag(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得LaneRangeFlag
	 * @details 
	 *
	 * @return LaneRange属性是否存在
	 */
	Navinfo::Nis::BOOL GetLaneRangeFlag() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucLaneRangeFlag			: 1;			///<	  LaneRange属性是否存在  
		};
	};
};


/**
 * @brief 车道的可行驶方向
 * 
 */
class DLL_PUBLIC CLaneMarkingInfo
{
public:
	CLaneMarkingInfo();

	explicit CLaneMarkingInfo(
		  const CLaneMarkingInfoFlag &m_clFlag_
		, const CLaneMarking &m_clLaneMarking_ = CLaneMarking()
		, const Navinfo::Nis::CLinearRange &m_clLaneRange_ = Navinfo::Nis::CLinearRange()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CLaneMarkingInfoFlag& GetFlag() const;

	/**
	 * @brief 取得LaneMarking
	 *
	 * @return 车道的可行驶方向
	 */
	const CLaneMarking& GetLaneMarking() const;

	/**
	 * @brief 取得LaneRange
	 *
	 * @return LaneRange
	 */
	const Navinfo::Nis::CLinearRange& GetLaneRange() const;


public:
	CLaneMarkingInfoFlag										m_clFlag;									///<	  Flag  
	CLaneMarking												m_clLaneMarking;							///<	  车道的可行驶方向  
	Navinfo::Nis::CLinearRange									m_clLaneRange;								///<	  LaneRange  
};


/**
 * @brief LaneConnectivityFlag
 * 
 */
class DLL_PUBLIC CLaneConnectivityFlag
{
public:
	CLaneConnectivityFlag();

	explicit CLaneConnectivityFlag(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得GeometryFlag
	 * @details 
	 *
	 * @return 是否存在中心线形状点
	 */
	Navinfo::Nis::BOOL GetGeometryFlag() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucGeometryFlag			: 1;			///<	  是否存在中心线形状点  
		};
	};
};


/**
 * @brief 车道中心线
 * 
 */
class DLL_PUBLIC CLaneCenterline
{
public:
	CLaneCenterline();

	explicit CLaneCenterline(
		  const CLaneConnectivityFlag &m_clFlag_
		, const Navinfo::Nis::CAdvancedGeometry3D &m_clGeometry_ = Navinfo::Nis::CAdvancedGeometry3D()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CLaneConnectivityFlag& GetFlag() const;

	/**
	 * @brief 取得Geometry
	 *
	 * @return 车道中心线形状情报
	 */
	const Navinfo::Nis::CAdvancedGeometry3D& GetGeometry() const;


public:
	CLaneConnectivityFlag										m_clFlag;									///<	  Flag  
	Navinfo::Nis::CAdvancedGeometry3D							m_clGeometry;								///<	  车道中心线形状情报  
};


/**
 * @brief 车道边线对应的一组平行线
 * 
 */
class DLL_PUBLIC CLaneBoundaryParallelElementGroup
{
public:
	CLaneBoundaryParallelElementGroup();

	explicit CLaneBoundaryParallelElementGroup(
		  const Navinfo::Nis::CAdvancedGeometry3D &m_clGeometry_
		, const vector< CLaneBoundaryParallelElement > &m_vclLaneBoundaryParallelElement_ = vector< CLaneBoundaryParallelElement >()
		);

public:
	/**
	 * @brief 取得Geometry
	 *
	 * @return Geometry
	 */
	const Navinfo::Nis::CAdvancedGeometry3D& GetGeometry() const;

	/**
	 * @brief 取得LaneBoundaryParallelElement的数量
	 *
	 * @return LaneBoundaryParallelElement的数量
	 */
	size_t GetNumLaneBoundaryParallelElement() const;

	/**
	 * @brief 取得数组LaneBoundaryParallelElement中下标为iNo的元素
	 * @details 
	 *
	 * @return LaneBoundaryParallelElement
	 */
	const CLaneBoundaryParallelElement& GetLaneBoundaryParallelElement( size_t iNo ) const;

	/**
	 * @brief 取得LaneBoundaryParallelElement
	 *
	 * @return LaneBoundaryParallelElement
	 */
	const vector< CLaneBoundaryParallelElement >& GetLaneBoundaryParallelElement() const;


public:
	Navinfo::Nis::CAdvancedGeometry3D							m_clGeometry;								///<	  Geometry  
	vector< CLaneBoundaryParallelElement >						m_vclLaneBoundaryParallelElement;			///<	  LaneBoundaryParallelElement  
};


/**
 * @brief 车道边线对应的平行线
 * 
 */
class DLL_PUBLIC CLaneBoundaryParallelElement
{
public:
	CLaneBoundaryParallelElement();

	explicit CLaneBoundaryParallelElement(
		  const vector< CLaneBoundaryElement > &m_vclLaneBoundaryElementList_
		);

public:
	/**
	 * @brief 取得LaneBoundaryElementList的数量
	 *
	 * @return LaneBoundaryElementList的数量
	 */
	size_t GetNumLaneBoundaryElementList() const;

	/**
	 * @brief 取得数组LaneBoundaryElementList中下标为iNo的元素
	 * @details 
	 *
	 * @return LaneBoundaryElementList
	 */
	const CLaneBoundaryElement& GetLaneBoundaryElementList( size_t iNo ) const;

	/**
	 * @brief 取得LaneBoundaryElementList
	 *
	 * @return LaneBoundaryElementList
	 */
	const vector< CLaneBoundaryElement >& GetLaneBoundaryElementList() const;


public:
	vector< CLaneBoundaryElement >								m_vclLaneBoundaryElementList;				///<	  LaneBoundaryElementList  
};


/**
 * @brief LaneBoundaryElementFlag
 * 
 */
class DLL_PUBLIC CLaneBoundaryElementFlag
{
public:
	CLaneBoundaryElementFlag();

	explicit CLaneBoundaryElementFlag(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得HasLaneRange
	 * @details 
	 *
	 * @return 车道边线是否只对应Geometry的部分范围
	 */
	Navinfo::Nis::BOOL GetHasLaneRange() const;

	/**
	 * @brief 取得HasSpecificWidth
	 * @details 
	 *
	 * @return 车道边线是否存在宽度
	 */
	Navinfo::Nis::BOOL GetHasSpecificWidth() const;

	/**
	 * @brief 取得HasSpecificBoundaryMaterial
	 * @details 
	 *
	 * @return 是否存在车道边线的材质
	 */
	Navinfo::Nis::BOOL GetHasSpecificBoundaryMaterial() const;

	/**
	 * @brief 取得HasSpecificColor
	 * @details 
	 *
	 * @return 是否存在车道边线的颜色
	 */
	Navinfo::Nis::BOOL GetHasSpecificColor() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucHasLaneRange			: 1;			///<	  车道边线是否只对应Geometry的部分范围  
			uchar												m_ucHasSpecificWidth		: 1;			///<	  车道边线是否存在宽度  
			uchar												m_ucHasSpecificBoundaryMaterial	: 1;		///<	  是否存在车道边线的材质  
			uchar												m_ucHasSpecificColor		: 1;			///<	  是否存在车道边线的颜色  
		};
	};
};


/**
 * @brief 车道边线对应的平行线的属性
 * 
 */
class DLL_PUBLIC CLaneBoundaryElement
{
public:
	CLaneBoundaryElement();

	explicit CLaneBoundaryElement(
		  const CLaneBoundaryElementFlag &m_clFlag_
		, const uchar &m_ucLaneBoundaryType_ = 0
		, const uchar &m_ucOpenToCurbSide_ = 0
		, const uchar &m_ucOpenToMiddleSide_ = 0
		, const uchar &m_ucLaneMarkingColor_ = 0
		, const uchar &m_ucLaneMarkingMaterial_ = 0
		, const uchar &m_ucLateralOffset_ = 0
		, const uchar &m_ucLaneBoundaryElementWidth_ = 0
		, const Navinfo::Nis::CLinearRange &m_clLaneRange_ = Navinfo::Nis::CLinearRange()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CLaneBoundaryElementFlag& GetFlag() const;

	/**
	 * @brief 取得LaneRange
	 *
	 * @return 车道边线SequentialElement对应Geometry的有效范围
	 */
	const Navinfo::Nis::CLinearRange& GetLaneRange() const;

	/**
	 * @brief 取得LaneBoundaryType
	 *
	 * @return 车道边线的类型
	 */
	LANE_BOUNDARY_TYPE GetLaneBoundaryType() const;

	/**
	 * @brief 取得OpenToCurbSide
	 *
	 * @return 是否允许跨越车道边线向路牙侧行驶
	 */
	Navinfo::Nis::BOOL GetOpenToCurbSide() const;

	/**
	 * @brief 取得OpenToMiddleSide
	 *
	 * @return 是否允许跨越车道边线向道路中央行驶
	 */
	Navinfo::Nis::BOOL GetOpenToMiddleSide() const;

	/**
	 * @brief 取得LaneMarkingColor
	 *
	 * @return 车道边线的颜色
	 */
	Navinfo::Nis::OBJECT_COLOR GetLaneMarkingColor() const;

	/**
	 * @brief 取得LaneMarkingMaterial
	 *
	 * @return 车道边线的材质
	 */
	LANE_BOUNDARY_MATERIAL GetLaneMarkingMaterial() const;

	/**
	 * @brief 取得LateralOffset
	 *
	 * @return 车道边线相对于LaneBoundaryParallelElementGroup中的Geometry的横向偏移量。通过Geometry与该偏移量可计算该LaneBoundaryElement的形状。单位：厘米。
	 */
	const uchar& GetLateralOffset() const;

	/**
	 * @brief 取得LaneBoundaryElementWidth
	 *
	 * @return 车道边线的宽度
	 */
	const uchar& GetLaneBoundaryElementWidth() const;


public:
	CLaneBoundaryElementFlag									m_clFlag;									///<	  Flag  
	Navinfo::Nis::CLinearRange									m_clLaneRange;								///<	  车道边线SequentialElement对应Geometry的有效范围  
	uchar														m_ucLaneBoundaryType;						///<	  车道边线的类型  
	uchar														m_ucOpenToCurbSide;							///<	  是否允许跨越车道边线向路牙侧行驶  
	uchar														m_ucOpenToMiddleSide;						///<	  是否允许跨越车道边线向道路中央行驶  
	uchar														m_ucLaneMarkingColor;						///<	  车道边线的颜色  
	uchar														m_ucLaneMarkingMaterial;					///<	  车道边线的材质  
	uchar														m_ucLateralOffset;							///<	  车道边线相对于LaneBoundaryParallelElementGroup中的Geometry的横向偏移量。通过Geometry与该偏移量可计算该LaneBoundaryElement的形状。单位：厘米。  
	uchar														m_ucLaneBoundaryElementWidth;				///<	  车道边线的宽度  
};


/**
 * @brief TransitionLaneTypeFlag
 * 
 */
class DLL_PUBLIC CTransitionLaneTypeFlag
{
public:
	CTransitionLaneTypeFlag();

	explicit CTransitionLaneTypeFlag(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得LaneRangeFlag
	 * @details 
	 *
	 * @return LaneRange属性是否存在
	 */
	Navinfo::Nis::BOOL GetLaneRangeFlag() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucLaneRangeFlag			: 1;			///<	  LaneRange属性是否存在  
		};
	};
};


/**
 * @brief 交换车道类型
 * 
 */
class DLL_PUBLIC CTransitionLaneType
{
public:
	CTransitionLaneType();

	explicit CTransitionLaneType(
		  const CTransitionLaneTypeFlag &m_clFlag_
		, const uchar &m_ucConnectType_ = 0
		, const Navinfo::Nis::CLinearRange &m_clLaneRange_ = Navinfo::Nis::CLinearRange()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CTransitionLaneTypeFlag& GetFlag() const;

	/**
	 * @brief 取得LaneRange
	 *
	 * @return LaneRange
	 */
	const Navinfo::Nis::CLinearRange& GetLaneRange() const;

	/**
	 * @brief 取得ConnectType
	 *
	 * @return 交换车道类型
	 */
	TRANSITION_LANE_TYPE GetConnectType() const;


public:
	CTransitionLaneTypeFlag										m_clFlag;									///<	  Flag  
	Navinfo::Nis::CLinearRange									m_clLaneRange;								///<	  LaneRange  
	uchar														m_ucConnectType;							///<	  交换车道类型  
};


/**
 * @brief WidthFlag
 * 
 */
class DLL_PUBLIC CWidthFlag
{
public:
	CWidthFlag();

	explicit CWidthFlag(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得LaneRangeFlag
	 * @details 
	 *
	 * @return LaneRange属性是否存在
	 */
	Navinfo::Nis::BOOL GetLaneRangeFlag() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucLaneRangeFlag			: 1;			///<	  LaneRange属性是否存在  
		};
	};
};


/**
 * @brief 宽度情报
 * 
 */
class DLL_PUBLIC CWidth
{
public:
	CWidth();

	explicit CWidth(
		  const CWidthFlag &m_clFlag_
		, const ushort &m_usWidth_ = 0
		, const Navinfo::Nis::CLinearRange &m_clLaneRange_ = Navinfo::Nis::CLinearRange()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CWidthFlag& GetFlag() const;

	/**
	 * @brief 取得LaneRange
	 *
	 * @return LaneRange
	 */
	const Navinfo::Nis::CLinearRange& GetLaneRange() const;

	/**
	 * @brief 取得Width
	 *
	 * @return 宽度。单位：厘米
	 */
	const ushort& GetWidth() const;


public:
	CWidthFlag													m_clFlag;									///<	  Flag  
	Navinfo::Nis::CLinearRange									m_clLaneRange;								///<	  LaneRange  
	ushort														m_usWidth;									///<	  宽度。单位：厘米  
};


/**
 * @brief 车道的可行驶方向的集合
 * 
 */
class DLL_PUBLIC CLaneMarkingSet
{
public:
	CLaneMarkingSet();

	explicit CLaneMarkingSet(
		  const vector< CLaneMarkingInfo > &m_vclLaneMarking_
		);

public:
	/**
	 * @brief 取得LaneMarking的数量
	 *
	 * @return LaneMarking的数量
	 */
	size_t GetNumLaneMarking() const;

	/**
	 * @brief 取得数组LaneMarking中下标为iNo的元素
	 * @details 
	 *
	 * @return 车道的可行驶方向
	 */
	const CLaneMarkingInfo& GetLaneMarking( size_t iNo ) const;

	/**
	 * @brief 取得LaneMarking
	 *
	 * @return 车道的可行驶方向
	 */
	const vector< CLaneMarkingInfo >& GetLaneMarking() const;


public:
	vector< CLaneMarkingInfo >									m_vclLaneMarking;							///<	  车道的可行驶方向  
};


/**
 * @brief 宽度情报集合
 * 
 */
class DLL_PUBLIC CWidthSet
{
public:
	CWidthSet();

	explicit CWidthSet(
		  const vector< CWidth > &m_vclWidthList_
		);

public:
	/**
	 * @brief 取得WidthList的数量
	 *
	 * @return WidthList的数量
	 */
	size_t GetNumWidthList() const;

	/**
	 * @brief 取得数组WidthList中下标为iNo的元素
	 * @details 
	 *
	 * @return WidthList
	 */
	const CWidth& GetWidthList( size_t iNo ) const;

	/**
	 * @brief 取得WidthList
	 *
	 * @return WidthList
	 */
	const vector< CWidth >& GetWidthList() const;


public:
	vector< CWidth >											m_vclWidthList;								///<	  WidthList  
};


/**
 * @brief 交换车道情报集合
 * 
 */
class DLL_PUBLIC CTransitionLaneTypeSet
{
public:
	CTransitionLaneTypeSet();

	explicit CTransitionLaneTypeSet(
		  const vector< CTransitionLaneType > &m_vclTransitionLaneTypeList_
		);

public:
	/**
	 * @brief 取得TransitionLaneTypeList的数量
	 *
	 * @return TransitionLaneTypeList的数量
	 */
	size_t GetNumTransitionLaneTypeList() const;

	/**
	 * @brief 取得数组TransitionLaneTypeList中下标为iNo的元素
	 * @details 
	 *
	 * @return TransitionLaneTypeList
	 */
	const CTransitionLaneType& GetTransitionLaneTypeList( size_t iNo ) const;

	/**
	 * @brief 取得TransitionLaneTypeList
	 *
	 * @return TransitionLaneTypeList
	 */
	const vector< CTransitionLaneType >& GetTransitionLaneTypeList() const;


public:
	vector< CTransitionLaneType >								m_vclTransitionLaneTypeList;				///<	  TransitionLaneTypeList  
};


/**
 * @brief 车道类型
 * 
 */
class DLL_PUBLIC CLaneType
{
public:
	CLaneType();

	explicit CLaneType(
		ushort v_ 
		);

public:
	/**
	 * @brief 取得OtherLane
	 * @details 
	 *
	 * @return 未知车道（除了上述特殊车道类型和常规车道外的类型）
	 */
	Navinfo::Nis::BOOL GetOtherLane() const;

	/**
	 * @brief 取得CompoundLane
	 * @details 
	 *
	 * @return 复合车道
	 */
	Navinfo::Nis::BOOL GetCompoundLane() const;

	/**
	 * @brief 取得DecelerationLane
	 * @details 
	 *
	 * @return 减速车道
	 */
	Navinfo::Nis::BOOL GetDecelerationLane() const;

	/**
	 * @brief 取得AccelerationLane
	 * @details 
	 *
	 * @return 加速车道
	 */
	Navinfo::Nis::BOOL GetAccelerationLane() const;

	/**
	 * @brief 取得DrivableParkingLane
	 * @details 
	 *
	 * @return 可行驶的停车车道
	 */
	Navinfo::Nis::BOOL GetDrivableParkingLane() const;

	/**
	 * @brief 取得RegulatedAccessLane
	 * @details 
	 *
	 * @return 管制车道
	 */
	Navinfo::Nis::BOOL GetRegulatedAccessLane() const;

	/**
	 * @brief 取得BusLane
	 * @details 
	 *
	 * @return 公交车道
	 */
	Navinfo::Nis::BOOL GetBusLane() const;

	/**
	 * @brief 取得BicycleLane
	 * @details 
	 *
	 * @return 自行车道
	 */
	Navinfo::Nis::BOOL GetBicycleLane() const;

	/**
	 * @brief 取得ShoulderLane
	 * @details 
	 *
	 * @return 路肩车道
	 */
	Navinfo::Nis::BOOL GetShoulderLane() const;

	/**
	 * @brief 取得ParkingLane
	 * @details 
	 *
	 * @return 停车车道
	 */
	Navinfo::Nis::BOOL GetParkingLane() const;

	/**
	 * @brief 取得BothDirectionLane
	 * @details 
	 *
	 * @return 双向车道、潮汐车道
	 */
	Navinfo::Nis::BOOL GetBothDirectionLane() const;

	/**
	 * @brief 取得CarpoolLane
	 * @details 
	 *
	 * @return HOV车道（多乘员车道）
	 */
	Navinfo::Nis::BOOL GetCarpoolLane() const;

	/**
	 * @brief 取得SlowLane
	 * @details 
	 *
	 * @return 爬坡车道
	 */
	Navinfo::Nis::BOOL GetSlowLane() const;

	/**
	 * @brief 取得EmergencyParkingBar
	 * @details 
	 *
	 * @return 紧急停车带
	 */
	Navinfo::Nis::BOOL GetEmergencyParkingBar() const;

	/**
	 * @brief 取得DrivableShoulderLane
	 * @details 
	 *
	 * @return 可行驶路肩车道
	 */
	Navinfo::Nis::BOOL GetDrivableShoulderLane() const;


public:
	union {
		ushort													v;
		struct {
			ushort												m_ucOtherLane				: 1;			///<	  未知车道（除了上述特殊车道类型和常规车道外的类型）  
			ushort												m_ucCompoundLane			: 1;			///<	  复合车道  
			ushort												m_ucDecelerationLane		: 1;			///<	  减速车道  
			ushort												m_ucAccelerationLane		: 1;			///<	  加速车道  
			ushort												m_ucDrivableParkingLane		: 1;			///<	  可行驶的停车车道  
			ushort												m_ucRegulatedAccessLane		: 1;			///<	  管制车道  
			ushort												m_ucBusLane					: 1;			///<	  公交车道  
			ushort												m_ucBicycleLane				: 1;			///<	  自行车道  
			ushort												m_ucShoulderLane			: 1;			///<	  路肩车道  
			ushort												m_ucParkingLane				: 1;			///<	  停车车道  
			ushort												m_ucBothDirectionLane		: 1;			///<	  双向车道、潮汐车道  
			ushort												m_ucCarpoolLane				: 1;			///<	  HOV车道（多乘员车道）  
			ushort												m_ucSlowLane				: 1;			///<	  爬坡车道  
			ushort												m_ucEmergencyParkingBar		: 1;			///<	  紧急停车带  
			ushort												m_ucDrivableShoulderLane	: 1;			///<	  可行驶路肩车道  
		};
	};
};

}
}

PRAGMA_PACK_POP

#endif	//	__NISLANECOMMONSTRUCT_H_
